import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Day_eleven {

    //倒置字符串
    //将一句话的单词进行倒置，标点不倒置。比如 I like beijing.
    //.gnijieb ekil I
    // 经过函数后变为：beijing. like I
    //输入描述：
    //每个测试输入包含1个测试用例： I like beijing. 输入用例长度不超过100
    //输出描述：
    //依次输出倒置之后的字符串,以空格分割
    //示例1
    //输入：
    //I like beijing.
    //输出：
    //beijing. like I
    public static  void Reverse(char[] s,int left,int right ){
        int l = left,r = right;
        while(l<r){
            char ch = s[l];
            s[l] = s[r];
            s[r] = ch;
            l++;
            r--;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] s = br.readLine().toCharArray();
        int n = s.length;
        Reverse(s,0,n-1);

        int left = 0;
        while(left < n){
            int right = left;
            while(right <n && s[right] != ' ') right++;
            Reverse(s,left,right-1);
            while (right <n && s[right] == ' ') right++;
            left = right;
        }
        for (char ch : s){
            System.out.print(ch);
        }
    }


    //买卖股票的最好时机（二）（贪心）
    //假设你有一个数组prices，长度为n，其中prices[i]是某只股票在第i天的价格，
    // 请根据这个价格数组，返回买卖股票能获得的最大收益
    //1. 你可以多次买卖该只股票，但是再次购买前必须卖出之前的股票
    //2. 如果不能获取收益，请返回0
    //3. 假设买入卖出均无手续费
    //数据范围：
    //0≤n≤1×10^5,1≤prices[i]≤10^4
    //要求：空间复杂度O(n)，时间复杂度O(n)
    //进阶：空间复杂度O(1)，时间复杂度O(n)
    //输入描述：
    //第一行输入一个正整数 n ，表示数组 prices 的长度
    //第二行输入 n 个正整数，表示数组中prices的值
    //输出描述：
    //输出最大收益
    //示例1
    //输入：
    //7
    //8 9 2 5 4 7 1
    //输出：
    //7
    //说明：
    //在第1天(股票价格=8)买入，第2天(股票价格=9)卖出，获利9-8=1
    //在第3天(股票价格=2)买入，第4天(股票价格=5)卖出，获利5-2=3
    //在第5天(股票价格=4)买入，第6天(股票价格=7)卖出，获利7-4=3
    //总获利1+3+3=7，返回7
    public static void main2(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = s.nextInt();
        }

        int val = 0;
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i-1]){
                val += arr[i] - arr[i-1];
            }
        }
        System.out.println(val);
    }



    //游游的水果大礼包（枚举）
    //链接：https://ac.nowcoder.com/acm/problem/255193
    //来源：牛客网
    //
    //游游有n个苹果，m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包，
    // 也可以把1个苹果和2个桃子组成价值b元的二号水果大礼包。游游想知道，
    // 自己最多能组成多少价值总和的大礼包？
    //输入描述:
    //四个正整数
    //n,m,a,b，用空格隔开。
    //分别代表苹果的数量、桃子的数量、一号大礼包价值、二号大礼包价值。
    //1≤n,m,a,b≤10^6
    //输出描述:
    //一个整数，代表大礼包的最大价值总和。
    //示例1
    //输入
    //3 4 1 2
    //输出
    //4
    //说明 组成两个二号水果大礼包，使用了2个苹果和4个桃子。总价值为4。
    public static void main1(String[] args) {
        Scanner s = new Scanner(System.in);

        long n = s.nextInt();
        long m = s.nextInt();
        long a = s.nextInt();
        long b = s.nextInt();

        long val = 0;
        for (long x =0;x<=Math.min(n/2,m);x++){
            long y = Math.min(n-x*2,(m-x)/2);
            val = Math.max(val,a*x +b*y);
        }
        System.out.println(val);
    }
}
